import os
from flask import Flask, jsonify, redirect, url_for
from flask_jwt_extended import JWTManager
from flask_pymongo import PyMongo
from flask_cors import CORS
from dotenv import load_dotenv
import datetime

# 加载环境变量
load_dotenv()

# 加载配置
from app.config import config

# 初始化 MongoDB 连接
mongo = PyMongo()

# 初始化 JWT
jwt = JWTManager()

def init_db(db):
    """初始化数据库，创建必要的集合和索引"""
    # 创建用户集合
    if 'users' not in db.list_collection_names():
        db.create_collection('users')
        db.users.create_index('username', unique=True)
        db.users.create_index('email', unique=True)
        db.users.create_index('staffId', unique=True)
        print("已创建users集合")

    # 创建角色集合
    if 'roles' not in db.list_collection_names():
        db.create_collection('roles')
        db.roles.create_index('name', unique=True)
        print("已创建roles集合")

    # 创建患者集合
    if 'patients' not in db.list_collection_names():
        db.create_collection('patients')
        db.patients.create_index('patientId', unique=True)
        print("已创建patients集合")

    # 创建病历集合
    if 'medical_records' not in db.list_collection_names():
        db.create_collection('medical_records')
        print("已创建medical_records集合")

    # 创建医嘱集合
    if 'medical_orders' not in db.list_collection_names():
        db.create_collection('medical_orders')
        db.medical_orders.create_index('orderId', unique=True)
        print("已创建medical_orders集合")

    # 创建药品集合
    if 'drugs' not in db.list_collection_names():
        db.create_collection('drugs')
        db.drugs.create_index('drugCode', unique=True)
        print("已创建drugs集合")

    # 创建药品库存集合
    if 'drug_inventory' not in db.list_collection_names():
        db.create_collection('drug_inventory')
        print("已创建drug_inventory集合")

    # 创建处方集合
    if 'prescriptions' not in db.list_collection_names():
        db.create_collection('prescriptions')
        print("已创建prescriptions集合")

    # 创建科室集合
    if 'departments' not in db.list_collection_names():
        db.create_collection('departments')
        db.departments.create_index('code', unique=True)
        print("已创建departments集合")

    # 创建预约集合
    if 'appointments' not in db.list_collection_names():
        db.create_collection('appointments')
        print("已创建appointments集合")
    
    # 注意：不再自动初始化基础数据和权限
    # 初始化基础数据现在需要手动调用单独的脚本执行
    # 原代码: 
    # from app.init_db import init_database
    # init_database(mongo_uri=os.getenv('MONGO_URI', 'mongodb://localhost:27017/medical_system'))

def create_app(config_name=None):
    """创建并配置Flask应用实例"""
    if config_name is None:
        config_name = os.getenv('FLASK_CONFIG', 'default')
    
    app = Flask(__name__)
    
    # 加载配置
    app.config.from_object(config[config_name])
    
    # 初始化扩展
    mongo.init_app(app)
    jwt.init_app(app)
    CORS(app)
    
    # 确保上传目录存在
    os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
    
    # 初始化数据库
    with app.app_context():
        init_db(mongo.db)
    
    # 注册根路由
    @app.route('/')
    def index():
        return jsonify({
            'success': True,
            'message': '医疗信息系统API服务',
            'version': 'v1',
            'api_base_url': '/api/v1'
        })
    
    # 注册蓝图
    from app.api.v1 import api_bp as api_v1_blueprint
    app.register_blueprint(api_v1_blueprint, url_prefix='/api/v1')
    
    # 注册错误处理
    from app.utils.error_handlers import register_error_handlers
    register_error_handlers(app)
    
    return app 